-- KEYS[1] 加锁的对象（也就是我们传入的的锁名称）
-- KEYS[2] 监听该锁的频道 也就是publish要发送锁被释放的频道，用于在锁释放时通知其他客户端可以重新获取锁了
-- ARGV[1]：解锁消息
-- ARGV[2] 表示锁的过期时间
-- ARGV[3]：UUID+当前线程id
-- 先判断自己的锁是不是已经释放了 ==0 表示key不存在了，也就是锁被释放了
if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then
    -- 返回nil,也就是null, 表示释放锁成功
    return nil;
end ;
-- 对锁的重入次数减一  因为重入一次counter会+1，所以释放时每次也只能-1，跟重入次数匹配
local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1);
-- 如果重入次数仍然大于0，续约过期时间
if (counter > 0) then
    redis.call('pexpire', KEYS[1], ARGV[2]);
    -- 返回解说失败
    return 0;
else
    -- 表示重入次数已经为0了，删除锁的key
    redis.call('del', KEYS[1]);
    -- 使用publish发布一个消息，其他订阅了的客户端收到消息，就说明解锁成功了饿、然后可以重新获取锁了
    redis.call('publish', KEYS[2], ARGV[1]);
    -- 返回1 表示解锁成功
    return 1;
end ;
return nil;